'use strict';

/**
 * https://socket.io/docs/
 * Socket.io不是Websocket，它只是将Websocket和轮询 （Polling）机制以及其它的实时通信方式封装成了通用的接口，并且在服务端实现了这些实时机制的相应代码。
 * 也就是说，Websocket仅仅是 Socket.io实现实时通信的一个子集。因此Websocket客户端连接不上Socket.io服务端，当然Socket.io客户端也连接不上Websocket服务端。
 * github上面也有通过JS封装好的Websocket库，其中ws可用于client和基于node搭建的服务端使用，但是用起来相对繁琐，star相对Socket.io较少。
 */
// socket.io server-side

const Controller = require('egg').Controller;
const room = 'default_room';

class ChatController extends Controller {
    async index() {
        const { app, socket, logger, helper } = this.ctx;
        const id = socket.id;

        // 连接命名空间
        const nsp = app.io.of('/');

        // 根据id给指定连接发送消息
        let counter = 0;
        setInterval(() => {
            nsp.sockets[id].emit('res', 'hello ' + counter++);
        }, 2000);

        // 指定房间连接信息列表
        // nsp.adapter.clients([room], (err, clients) => {
        //     console.log(JSON.stringify(clients));
        // });


        //  给指定房间的每个人发送消息
        this.ctx.app.io.of('/').to(room).emit('online', this.ctx.socket.id + ' --->上线了');

        // 接收客户端发送来的信息
        this.ctx.socket.on('hey', msg => {
            // console.log(msg)
            // this.ctx.emit('res', "来自 client 信息：" + msg)
        });


        // 断开连接
        // this.ctx.socket.disconnect();
    }


    // event - service
    async wechat() {
        const { app, socket } = this.ctx;
        socket.on('ch', msg => {
            console.log('receviced clients data : ' + msg);
        });


        // 每隔2s 触发一次事件haha
        setInterval(() => {
            let city = ['guangzhou', 'beijing', 'shanghai', 'chongqin', 'shenzhen']
            let num = Math.floor(Math.random() * (0 - (city.length - 1)) + (city.length - 1));
            socket.emit('haha', { name: city[num], code: Math.round(Math.random(10000) * 10000, 4) });
        }, 2000);


    }


}

module.exports = ChatController;